// ... 展开运算符
// json.stringify 不支持undefined  函数类型

// 实现深拷贝
function deepClone(obj, hash=new WeakMap()) {
  if(obj==null) {
    return obj
  }
  // 不是对象
  if(typeof obj !== 'object') {
    return obj
  }
  if(obj instanceof Date) return new Date(obj)
  if(obj instanceof RegExp) return new RegExp(obj)

  if(hash.has(obj)) return hash.get(obj);

  let cloneObj = new obj.constructor()

  hash.set(obj, cloneObj)

  for(let key in obj) {
    if(obj.hasOwnProperty) {
      cloneObj[key] =  deepClone(obj[key], hash);
    }
  }

  return cloneObj
}

let obj = {a:1,b:{v:2}}
obj.xx = obj
console.log(deepClone(obj))
// 循环引用自己 会有问题